#ifndef _STK_HW_H_
#define _STK_HW_H_

#include "soc.h"

typedef struct {
	_RW CTRL;      /*!< Offset: 0x000 SysTick Control and Status Register */
	_RW LOAD;      /*!< Offset: 0x004 SysTick Reload Value Register */
	_RW VAL;       /*!< Offset: 0x008 SysTick Current Value Register */
	_OR CALIB;     /*!< Offset: 0x00C SysTick Calibration Register */
} STK_Struct;

extern STK_Struct SOC_STK;

/**
 * 控制
 */
#define STK_CTRL_EN        (0x1U<<0)  /* 使能计数，递减计数 */
#define STK_CTRL_TICKINT   (0x1U<<1)  /* 使能中断 */
#define STK_CTRL_AHB_DIV8  (0x0U<<2)  /* AHB 8分频 */
#define STK_CTRL_AHB_DIV1  (0x1U<<2)  /* 和CPU同频 */
#define STK_CTRL_COUNTFLAG (0x1U<<16) /* 当计数器计到0时，该标志置一 */

/**
 * 定时器加载值
 */
#define STK_LOAD_2_16777216D(val) (((val)-1)&0x0FFFFFFF)  /* 计数值，需要减一，寄存器写0无意义 */

/**
 * 计时器计数值，递减计数，减到0，会重新加载值
 */
#define STK_VAL_CLR         (0x0)  /* 该寄存器读返回计数值，写任意值会清0，并清除STK_CTRL_COUNTFLAG */

#endif /* _STK_HW_H_ */
